#ifndef __MY_HOT__
#define __MY_HOT__
#include <unistd.h>
#include "data.hpp"

// 声明一个外部的全局DataManager指针变量
extern cloud::DataManager *_data;

namespace cloud
{
    class HotManager
    {
    private:
        std::string _back_dir;    // 备份目录路径
        std::string _pack_dir;    // 压缩包存储目录路径
        std::string _pack_suffix; // 压缩文件后缀名
        int _hot_time;            // 热点时间阈值（秒）

    private:
        // 判断文件是否为非热点文件
        bool HotJudge(const std::string &filename)
        {
            FileUtil fu(filename);
            time_t last_atime = fu.LastATime(); // 获取文件最后访问时间
            time_t cur_time = time(nullptr);    // 获取当前时间
            if (cur_time - last_atime > _hot_time)
            {
                // 如果超过热点时间阈值，返回true（非热点文件）
                return true;
            }
            return false; // 否则返回false（热点文件）
        }

    public:
        HotManager()
        {
            // 从配置单例中获取各种配置参数
            Config *config = Config::GetInstance();
            _back_dir = config->GetBackDir();
            _pack_dir = config->GetPackDir();
            _pack_suffix = config->GetPackFileSuffix();
            _hot_time = config->GetHotTime();

            // 确保备份目录和压缩目录存在
            FileUtil tmp1(_back_dir);
            FileUtil tmp2(_pack_dir);
            tmp1.CreateDirectory(); // 创建备份目录
            tmp2.CreateDirectory(); // 创建压缩目录
        }

        bool RunModule()
        {
            while (true)
            {
                // 1.遍历备份目录，获取所有文件名
                FileUtil fu(_back_dir);
                std::vector<std::string> arry;
                fu.ScanDirectory(&arry);

                // 2.遍历判断文件是否是非热点文件
                for (auto &e : arry)
                {
                    if (HotJudge(e) == false)
                    {
                        continue; // 热点文件跳过
                    }

                    // 3.获取文件的备份信息
                    BackupInfo bi;
                    if (_data->GetOneByRealPath(e, &bi) == false)
                    {
                        // 如果文件存在但没有备份信息，则创建新的备份信息
                        bi.NewBackupInfo(e);
                    }

                    // 4. 对非热点文件进行压缩处理
                    FileUtil tmp(e);
                    tmp.Compress(bi.pack_path);

                    //5. 删除源文件，修改备份信息
                    tmp.Remove();
                    bi.pack_flag = true;
                    _data->Update(bi);
                }
                usleep(1000); // 短暂休眠，避免CPU占用过高
            }
            return true;
        }
    };
}

#endif